home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Java Programmer's Toolkit
/
Java Programmer's Toolkit.iso
/
applets
/
collectn
/
rbpair.jav
< prev
next >
Wrap
Text File
|
1995-12-14
|
4KB
|
183 lines
/*
File: RBPair.java
Originally written by Doug Lea and released into the public domain.
Thanks for the assistance and support of Sun Microsystems Labs, Agorics
Inc, Loral, and everyone contributing, testing, and using this code.
History:
Date Who What
24Sep95 dl@cs.oswego.edu Create from collections.java working file
13Oct95 dl Changed protection statuses
*/
package collections;
import java.util.Enumeration;
import java.util.NoSuchElementException;
/**
*
* RBPairs are RBCells with keys.
*
* @author Doug Lea
* @version 0.93
*
* <P> For an introduction to this package see <A HREF="index.html"> Overview </A>.
**/
public class RBPair extends RBCell implements Pair {
// instance variable
private Object key_;
/**
* Make a cell with given key and element values, and null links
**/
public RBPair(Object k, Object v) { super(v); key_ = k; }
/**
* Make a new node with same key and element values, but null links
**/
protected Object clone() throws CloneNotSupportedException {
RBPair t = new RBPair(key_, element());
t.color_ = color_;
return t;
}
/**
* return the key
**/
public final Object key() { return key_; }
/**
* set the key
**/
public final void key(Object k) { key_ = k; }
/**
* Implements RBCell.find.
* Override RBCell version since we are ordered on keys, not elements, so
* element find has to search whole tree.
* comparator argument not actually used.
* @see RBCell#find
**/
public RBCell find(Object element, Comparator cmp) {
RBCell t = this;
while (t != null) {
if (t.element().equals(element)) return t;
else if (t.right_ == null)
t = t.left_;
else if (t.left_ == null)
t = t.right_;
else {
RBCell p = t.left_.find(element, cmp);
if (p != null) return p;
else
t = t.right_;
}
}
return null; // not reached
}
/**
* Implements RBCell.count.
* @see RBCell#count
**/
public int count(Object element, Comparator cmp) {
int c = 0;
RBCell t = this;
while (t != null) {
if (t.element().equals(element)) ++c;
if (t.right_ == null)
t = t.left_;
else if (t.left_ == null)
t = t.right_;
else {
c += t.left_.count(element, cmp);
t = t.right_;
}
}
return c;
}
/**
* find and return a cell holding key, or null if no such
**/
public RBPair findKey(Object key, Comparator cmp) {
RBPair t = this;
for (;;) {
int diff = cmp.compare(key, t.key_);
if (diff == 0) return t;
else if (diff < 0) t = (RBPair)(t.left_);
else t = (RBPair)(t.right_);
if (t == null) return null;
}
}
/**
* find and return a cell holding (key, element), or null if no such
**/
public RBPair find(Object key, Object element, Comparator cmp) {
RBPair t = this;
for (;;) {
int diff = cmp.compare(key, t.key_);
if (diff == 0 && t.element().equals(element)) return t;
else if (diff <= 0) t = (RBPair)(t.left_);
else t = (RBPair)(t.right_);
if (t == null) return null;
}
}
/**
* return number of nodes of subtree holding key
**/
public int countKey(Object key, Comparator cmp) {
int c = 0;
RBPair t = this;
while (t != null) {
int diff = cmp.compare(key, t.key_);
// rely on insert to always go left on <=
if (diff == 0) ++c;
if (diff <= 0) t = (RBPair)(t.left_);
else t = (RBPair)(t.right_);
}
return c;
}
/**
* return number of nodes of subtree holding (key, element)
**/
public int count(Object key, Object element, Comparator cmp) {
int c = 0;
RBPair t = this;
while (t != null) {
int diff = cmp.compare(key, t.key_);
if (diff == 0) {
if (t.element().equals(element)) ++c;
if (t.left_ == null)
t = (RBPair)(t.right_);
else if (t.right_ == null)
t = (RBPair)(t.left_);
else {
c += ((RBPair)(t.right_)).count(key, element, cmp);
t = (RBPair)(t.left_);
}
}
else if (diff < 0) t = (RBPair)(t.left());
else t = (RBPair)(t.right());
}
return c;
}
}